// 引入管理者数据模型
const adminModel = require('../db/modules/adminModule')
// 引入自己写的工具函数(生成token的函数)
const jwt = require('./jwtManger')
// 🌞 定义一个验证token的中间件，广告的增删改查都要先校验token
async function VerToken(req,res,next){
    // 😡 注意，req.fields只能应用在post请求上边，所以，当这个中间件用在grt请求上时，就取不到id的值
    // 😡 因此，要处理一下中间件的兼容性
    let id = req.fields.id || req.query.id
    // 从请求头中获取token数据
    let token = req.get('token')
    // 验证是否存在token，若不存在则返回失败
    if(!token) return res.send({"code":0,"msg":"token失效，请重新登录"})
    // 若token存在，和数据库中的token进行校验，若不存在则返回失败
    // findOne的返回值： 如果成功 返回一条数据文档 如果失败 返回值为null
    let admin = await adminModel.findOne({_id:id,token})
    if(!admin) return res.send({"code":0,"msg":"token失效，请重新登录"})
    // 若token存在并且token和数据库中的一致，验证有效期
    // 当前的时间戳
    let currentTime = Date.now()
    // token中存储的 (创建token的时间戳 + 有效期)的时间戳
    let liveTime = jwt.decodeToken(token).expires
    // 如果过期，则失效，返回失败
    if(currentTime >= liveTime) return res.send({"code":0,"msg":"token失效，请重新登录"})
    // 若满足上述三点if条件，则验证通过
    // res.send({"code":1,"msg":"token通过验证"})
    next()
}
module.exports = VerToken 